﻿// Packets POJ - 1017.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include <iostream>
#include <algorithm>


using namespace std;
//https://vjudge.csgrandeur.cn/problem/POJ-1017
/*
一个工厂生产的产品使用相同高度h的正方形包装，大小分别为1*1、2*2、3*3、4*4、5*5、6*6。
这些产品总是以与其高度h相同的正方形包裹的形式交付给客户，尺寸为6*6。由于费用问题，工厂和客户都希望将从工厂到客户的订单所需的包裹数量最小化。
一个解决根据订单找到所需最小包裹数量的好程序将节省大量资金。请您编写这样一个程序。

输入
输入文件由多行组成，每行描述一个订单。每行由六个整数组成，用一个空格分隔，依次表示不同尺寸（从最小的1*1到最大的6*6）的包装的数量。
输入文件以包含六个零的那一行表示输入结束。

输出
输出文件对应于输入文件中的每一行，每一行包含对应行的订单能够装入的最小包裹数量。输出文件中没有对应于输入文件中最后的“null”行的行。

0 0 4 0 0 1
7 5 1 0 0 0
0 0 0 0 0 0

2
1


0 10 0 0 0 0

2

65 65 513 1 8 8
58 63 33 3 3 3

153
24

13 2 0 1 0 0

1
*/

int arr[7];
int ans = 0;


void solve() {
	ans = 0;

	ans += arr[6];

	if (arr[5] != 0) {
		ans += arr[5];
		arr[1] -= min(arr[1],arr[5] * (6*6-5*5));
	}

	if (arr[4] != 0) {
		ans += arr[4];

		int left = (arr[4] * 5 - min(arr[2], arr[4] * 5)) * 2 * 2;
		//还有剩下的填充 1*1
		arr[1] -= min(arr[1], left);

		//尝试填充2
		arr[2] -= min(arr[2], arr[4] * 5);
	}

	if (arr[3] != 0) {
		ans += arr[3] / 4;
		arr[3] %= 4;
		if (arr[3] != 0) ans++;
		//尝试填充 2*2
		if (arr[3] == 1) {
			arr[1] -= min(arr[1], 6 * 6 - 3 * 3 - (min(arr[2], 5) * 2 * 2));
			arr[2] -= min(arr[2], 5);
		}
		else if (arr[3] == 2) {
			arr[1] -= min(arr[1],6 * 6 - 3 * 3*2 - (min(arr[2], 3) * 2 * 2));
			arr[2] -= min(arr[2], 3);
		}
		else if (arr[3] == 3) {
			arr[1] -= min(arr[1],6 * 6 - 3 * 3 * 3 - (min(arr[2], 1) * 2 * 2));
			arr[2] -= min(arr[2], 1);
		}
	}

	if (arr[2] != 0) {
		ans += arr[2] / 9;
		arr[2] %= 9;
		if (arr[2] != 0) ans++;
		arr[1] -= min(arr[1], 6 * 6 - arr[2] * 4);
	}

	if (arr[1] != 0) {
		ans += arr[1] / 36;
		arr[1] %= 36; 
		if (arr[1] != 0) ans++;
	}

	cout << ans << endl;
}

int main()
{
	while (1) {
		int flag = 0;
		for (int i = 1; i <= 6; i++) {
			cin >> arr[i];
			if (arr[i] != 0) flag = 1;
		}
		if (0 == flag) break;
		solve();
	}

	return 0;
}

 